package com.buyman.server.controller;

import java.io.File;
import java.io.IOException;
import java.sql.Time;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

import sun.tools.jar.resources.jar;

import com.buyman.server.bean.gp.ExcepcionHorario;
import com.buyman.server.bean.gp.FranjaHoraria;
import com.buyman.server.bean.gp.Imagen;
import com.buyman.server.bean.gp.ImagenTab;
import com.buyman.server.bean.gp.Proveedor;
import com.buyman.server.bean.gp.Publicidad;
import com.buyman.server.bean.gp.Punto;
import com.buyman.server.bean.gp.PuntosZona;
import com.buyman.server.bean.gp.RedSocial;
import com.buyman.server.bean.gp.Rubro;
import com.buyman.server.bean.gp.ServicioProveedor;
import com.buyman.server.bean.gp.TabGenerico;
import com.buyman.server.bean.gp.TabInfo;
import com.buyman.server.bean.gp.TabServicios;
import com.buyman.server.bean.gp.TipoSucesoProveedor;
import com.buyman.server.bean.gp.Ubicacion;
import com.buyman.server.bean.gp.VistaConsumidor;
import com.buyman.server.bean.gp.Zona;
import com.buyman.server.bean.pp.ComentarioProducto;
import com.buyman.server.bean.pp.Cupon;
import com.buyman.server.bean.pp.ImagenProducto;
import com.buyman.server.bean.pp.Oferta;
import com.buyman.server.bean.pp.Producto;
import com.buyman.server.bean.pp.ProveedorProductos;
import com.buyman.server.bean.pp.VistaProductos;
import com.buyman.server.bean.su.TipoSuceso;
import com.buyman.server.bean.us.Mensaje;
import com.buyman.server.bean.us.TipoSucesoUsuario;
import com.buyman.server.bean.us.Usuario;
import com.buyman.server.bean.us.UsuarioProveedorEstado;
import com.buyman.server.bo.IComentarioBO;
import com.buyman.server.bo.IMensajesBO;
import com.buyman.server.bo.IProductoBO;
import com.buyman.server.bo.IProveedorBO;
import com.buyman.server.bo.ISucesosBO;
import com.buyman.server.bo.IUbicacionBO;
import com.buyman.server.bo.IUsuarioBO;
import com.buyman.server.bo.IVistaBO;
import com.buyman.server.fileUpload.FileUploadManager;
import com.buyman.server.helper.BuymanHelper;
import com.buyman.server.http.GeoCoderRequest;
import com.buyman.server.util.AccessApplicationProperties;
import com.sun.org.apache.xalan.internal.xsltc.runtime.Hashtable;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JsonHierarchicalStreamDriver;

public class SaveConfiguracionSitioController extends AbstractController{
	
	private static Log log = LogFactory.getLog(SaveConfiguracionSitioController.class);
	private IProveedorBO proveedorBO;
	private IUbicacionBO ubicacionBO;
	private IUsuarioBO usuarioBO;
	private IVistaBO vistaBO;
	private IMensajesBO mensajesBO;
	private IProductoBO productoBO;
	private IComentarioBO comentarioBO;
	private ISucesosBO sucesosBO;
	private String setCupones;
	private String setOfertas;
	
	protected ModelAndView handleRequestInternal(HttpServletRequest req, HttpServletResponse res) throws Exception {
		// TODO Auto-generated method stub
		String funcion = req.getParameter("funcion");
		if (funcion.equals("searchUsuarios"))
			this.searchUsuarios(req, res);
		else if (funcion.equals("getAdministradores"))
			this.getAdministradores(req, res);
		else if (funcion.equals("getOperadores"))
			this.getOperadores(req, res);
		else if (funcion.equals("salvarConfiguracion"))
			this.salvarConfiguracion(req, res);
		else if (funcion.equals("cancelarPublicidades"))
			this.cancelarPublicidades(req);
		else if (funcion.equals("searchUsuariosProveedor"))
			this.searchUsuariosProveedor(req, res);
		else if (funcion.equals("getUsuariosNotif"))
			this.getUsuariosNotif(req, res);
		else if (funcion.equals("searchProductos"))
			this.searchProductos(req, res);
		else if (funcion.equals("searchProductosOfertas"))
			this.searchProductosOfertas(req, res);
		if (funcion.equals("editarFotos"))
			this.editarFotos(req, res);
		else if (funcion.equals("cancelarEditarFotos"))
			this.cancelarEditarFotos(req, res);
		return null;
	}
	
	private void salvarConfiguracion (HttpServletRequest req, HttpServletResponse res) throws Exception
	{
		JSONArray jarray = new JSONArray ();
		String idProveedor = req.getParameter("idProveedor");
		String identificador = req.getParameter("identificador");
		
		Proveedor proveedor = this.getProveedorBO().getProveedorByIdentificador(identificador);
		boolean mismoprov = false;
		if (proveedor !=null && proveedor.getId().toString().equals(idProveedor))
			mismoprov = true;
			
		if (mismoprov || proveedor == null)
		{
			if (!mismoprov)
				proveedor = this.getProveedorBO().getProveedorById(idProveedor);
			
			String razonSocial = req.getParameter("razonSocial");
			proveedor.setRazonSocial(razonSocial);
			proveedor.setIdentificador(identificador);
			VistaConsumidor vistaConsumidor = proveedor.getVistaConsumidor();
			String minima = req.getParameter("minima");
			if (minima.equals(""))
				minima = "0";
			proveedor.setCompraMinima(new Double(minima));
			String direccion = req.getParameter("direccion");
			vistaConsumidor.setDireccion(direccion);
			String telefono = req.getParameter("telefono");
			vistaConsumidor.setTelefono(telefono);
			String tiempo = req.getParameter("tiempo");
			proveedor.setTiempoEntrega(tiempo);
			String mails = req.getParameter("mails");
			vistaConsumidor.setMails(mails);
			
			String logo = req.getParameter("logo");
			Imagen imagen = vistaConsumidor.getLogo();
			File file = (File) FileUploadManager.getInstance().getFiles().get("logo_" + idProveedor + "_");
			if (file!=null)
			{
				if (logo.equals(file.getName()) && !logo.equals(""))
				{
					File fileResized = FileUploadManager.getInstance().resizeImage(file);
					if (imagen!=null)
					{
						imagen.setFile(FileUploadManager.getInstance().getBytesFile(fileResized));
						imagen.setFileName(logo);
					}
					else
					{
						imagen = new Imagen ();
						imagen.setFile(FileUploadManager.getInstance().getBytesFile(fileResized));
						imagen.setFileName(logo);
						vistaConsumidor.setLogo(imagen);
					}
					fileResized.delete();
					this.getProveedorBO().guardarImagen(imagen);
				}
				file.delete();
				FileUploadManager.getInstance().getFiles().remove("logo_" + idProveedor + "_");
			}
			if (imagen!=null)
				jarray.put(imagen.getId().toString());
			else
				jarray.put("");
			
			String idUbicacion = req.getParameter("ubicacion");
			Ubicacion ubicacion = this.getUbicacionBO().getUbicacionById(idUbicacion);
			proveedor.setUbicacion(ubicacion);
			
			TabGenerico tab = vistaConsumidor.getTabs().get(2);
			String info = req.getParameter("info");
			((TabInfo)tab).setTexto(info);
			
			this.saveRedesSociales(req, proveedor);
			
			this.saveFranjasHorarias(req, proveedor);
			
			this.saveServicios(req, proveedor);
			
			this.saveRubros(req, proveedor);
			
			this.saveAdminSite(req, proveedor, idProveedor);
			
			this.saveNotificaciones(req, proveedor);
			
			this.saveTabs(req, proveedor);
			
			this.savePublicidades(req, idProveedor, proveedor);
			
			this.saveOfertas(req, idProveedor, proveedor);
			
			this.saveSucursales(req, proveedor);
			
			Cupon cupon = this.saveCupon(req, proveedor);
			
			String tarjetas = req.getParameter("tarjetas");
			proveedor.setTarjetasDeCredito(tarjetas);
			
			this.getProveedorBO().guardarProveedor(proveedor);
			this.getProveedorBO().refrescarProveedor(proveedor);
			proveedor = this.getProveedorBO().getProveedorById(idProveedor);
			
			String tipoUsuario = "";
			String idUsuario = req.getParameter("idUsuario");
			Usuario duenio = proveedor.getDuenio();
			if (duenio.getId().toString().equals(idUsuario))
				tipoUsuario = "duenio";
			else
			{
				Boolean esAdmin = this.getUsuarioBO().usuarioEsAdministradorProveedor(idUsuario, idProveedor);
				if (esAdmin)
					tipoUsuario = "administrador";
			}
			
			jarray.put(BuymanHelper.getInstance().getRedesSociales(proveedor.getRedesSociales()));
			jarray.put(BuymanHelper.getInstance().getEditarServicios(proveedor, this.getVistaBO().getServiciosByTipo(proveedor.getTipo())));
			jarray.put("");
			jarray.put(this.getPublicidades(proveedor.getPublicidades()));
			jarray.put(duenio.getMail());
			jarray.put(tipoUsuario);
			
			Usuario usuario = this.getUsuarioBO().getUsuarioById(idUsuario);
			String path = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath() + "/";
			
			List<Mensaje> mensSites = this.getMensajesBO().getMensajesNoLeidosByProveedoresUsuario(usuario.getProveedoresUsuario());
			List<ComentarioProducto> comentariosSites = this.getComentarioBO().getComentariosProductoPendientesByProveedoresUsuario( usuario.getProveedoresUsuario() );
			
			jarray.put(BuymanHelper.getInstance().agregarSitios(usuario, path, mensSites, comentariosSites));
			jarray.put(duenio.getId().toString());
			
			jarray.put(this.getCupones(this.getProductoBO().getCuponesByProveedorOrderByFecha(idProveedor)));
			jarray.put(this.getSetCupones());
			if (cupon!=null)
				jarray.put(BuymanHelper.getInstance().getUltimoCupon(cupon, path, false, "configuracionSitio.abrirDetailCupon(new Date(" + cupon.getFin().getTime() + ")," + cupon.getId() + ")", "", idUsuario));
			else
				jarray.put(BuymanHelper.getInstance().getUltimoCupon(cupon, path, false, "configuracionSitio.abrirDetailCupon(new Date(0),'')", "", idUsuario));
			StringBuffer textoInfoCupon = new StringBuffer("");
			textoInfoCupon.append(BuymanHelper.getInstance().getUltimoCuponInfo(cupon));
			String displayAgregarCupon = "display:none";
			if (cupon != null)
			{
				String estado = BuymanHelper.getInstance().getEstadoValorCupon(cupon); 
				if(estado.equals("2") || estado.equals("3"))
					displayAgregarCupon = "";
			}
			else
				displayAgregarCupon = "";
			textoInfoCupon.append("" +
				"<li>" +
					"<hr>" +
					"<a onclick='configuracionSitio.bajarHistoricoCupones($(this))'>" + AccessApplicationProperties.getResourceValue("buyman.configuracionsitio.cupones.verhistorico.label") + "</a>" +
					"<a onclick='configuracionSitio.bajarAgregarCupon($(this))' style='margin-left:30px;" + displayAgregarCupon + "'>" + AccessApplicationProperties.getResourceValue("buyman.configuracionsitio.cupones.agregarcupon.label") + "</a>" +
				"</li>");
			
			jarray.put(textoInfoCupon);
			
			jarray.put(this.getOfertas(((ProveedorProductos)proveedor).getOfertas()));
			jarray.put(this.getSetOfertas());
			
			StringBuffer scriptFr1 = new StringBuffer("");
			StringBuffer scriptFr2 = new StringBuffer("");
			StringBuffer scriptFr3 = new StringBuffer("");
			jarray.put(BuymanHelper.getInstance().getFranjasHorarias(this.getProveedorBO().getFranjasHorariasComercioByProveedorOrderByHora(idProveedor), scriptFr1));
			jarray.put(BuymanHelper.getInstance().getFranjasHorariasDelivery(this.getProveedorBO().getFranjasHorariasDeliveryByProveedorOrderByHora(idProveedor), scriptFr2));
			jarray.put(proveedor.getVistaConsumidor().getTabs().get(3).getId());
			jarray.put(scriptFr1);
			jarray.put(scriptFr2);
			jarray.put(BuymanHelper.getInstance().getExcepcionesHorario(this.getProveedorBO().getExcepcionesHorarioByProveedorOrderByFecha(idProveedor), scriptFr3));
			jarray.put(scriptFr3);
			jarray.put(BuymanHelper.getInstance().getEditarRubros(proveedor, this.getProveedorBO().getRubrosByTipo(proveedor.getTipo())));
			
			req.getSession().setAttribute("tipoUsuario", tipoUsuario);
		}
		else
		{
			jarray.put("identificador_existente");
		}
		
		XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
		xstream.setMode(XStream.NO_REFERENCES);
		String result = xstream.toXML(jarray);
		result = result.substring(result.indexOf("myArrayList") + 14);// TODO basura
		res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate,post-check=0, pre-check=0");
		res.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
		res.getWriter().write(result.substring(0, result.length() - 2));// TODO basura
	}
	
	private void saveRedesSociales (HttpServletRequest req, Proveedor proveedor)
	{
		Iterator<RedSocial> itRedes = proveedor.getRedesSociales().iterator();
		while (itRedes.hasNext())
		{
			RedSocial redSocial = itRedes.next();
			String red = req.getParameter("redsocial_" + redSocial.getId());
			if (red!=null)
			{
				int index = red.indexOf("_");
				String tipo = red.substring(0,index);
				String link = red.substring(index+1);
				redSocial.setRedSocial(tipo);
				redSocial.setLink(link);
				this.getProveedorBO().guardarRedSocial(redSocial);
			}
			else
				this.getProveedorBO().eliminarRedSocial(redSocial);
		}
		int pos = 0;
		String red = req.getParameter("redsocial_nueva_" + pos++);
		while (red!=null)
		{
			RedSocial redSocial = new RedSocial ();
			int index = red.indexOf("_");
			String tipo = red.substring(0,index);
			String link = red.substring(index+1);
			redSocial.setLink(link);
			redSocial.setRedSocial(tipo);
			redSocial.setProveedor(proveedor);
			this.getProveedorBO().guardarRedSocial(redSocial);
			red = req.getParameter("redsocial_nueva_" + pos++);
		}
		
		String idPaginaFB = req.getParameter("idPaginaFB");
		if (idPaginaFB != null && !idPaginaFB.equals(""))
			proveedor.setIdFB( Long.parseLong( idPaginaFB ) );
		Boolean publicaAutomaticamenteFB = ( req.getParameter("publicaAutomaticamenteFB").equals( "true" ) == true );
		proveedor.setPermitirComentariosProductoFBAutomaticamente( publicaAutomaticamenteFB );
	}
	
	private void saveFranjasHorarias (HttpServletRequest req, Proveedor proveedor) throws Exception
	{
		String marcarAbierto = req.getParameter("marcarAbierto");
		proveedor.setMarcarAbierto(new Boolean(marcarAbierto));
		String abrirAutomatico = req.getParameter("abrirAutomatico");
		proveedor.setAbrirAutomatico(new Boolean(abrirAutomatico));
		String permitirPedidosCerrados = req.getParameter("permitirPedidosCerrados");
		proveedor.setPermitirPedidosCerrados(new Boolean(permitirPedidosCerrados));
		
		Iterator<FranjaHoraria> itFranjas = this.getProveedorBO().getFranjasHorariasComercioByProveedorOrderByHora(proveedor.getId().toString()).iterator();
		while (itFranjas.hasNext())
		{
			FranjaHoraria franjaHoraria = itFranjas.next();
			String franja = req.getParameter("franjahoraria_" + franjaHoraria.getId());
			if (franja!=null)
				this.editarFranja(franjaHoraria, franja, proveedor, "1");
			else
				this.getProveedorBO().eliminarFranjaHoraria(franjaHoraria);
		}
		int pos = 0;
		String franja = req.getParameter("franjahoraria_nueva_" + pos++);
		while (franja!=null)
		{
			FranjaHoraria franjaHoraria = new FranjaHoraria ();
			this.editarFranja(franjaHoraria, franja, proveedor, "1");
			franja = req.getParameter("franjahoraria_nueva_" + pos++);
		}
		
		itFranjas = this.getProveedorBO().getFranjasHorariasDeliveryByProveedorOrderByHora(proveedor.getId().toString()).iterator();
		while (itFranjas.hasNext())
		{
			FranjaHoraria franjaHoraria = itFranjas.next();
			franja = req.getParameter("franjahorariadelivery_" + franjaHoraria.getId());
			if (franja!=null)
				this.editarFranja(franjaHoraria, franja, proveedor, "2");
			else
				this.getProveedorBO().eliminarFranjaHoraria(franjaHoraria);
		}
		pos = 0;
		franja = req.getParameter("franjahorariadelivery_nueva_" + pos++);
		while (franja!=null)
		{
			FranjaHoraria franjaHoraria = new FranjaHoraria ();
			this.editarFranja(franjaHoraria, franja, proveedor, "2");
			franja = req.getParameter("franjahorariadelivery_nueva_" + pos++);
		}
		
		Iterator<ExcepcionHorario> itExcep = this.getProveedorBO().getExcepcionesHorarioByProveedorOrderByFecha(proveedor.getId().toString()).iterator();
		while (itExcep.hasNext())
		{
			ExcepcionHorario excepcionHorario = itExcep.next();
			franja = req.getParameter("excepcionhorario_" + excepcionHorario.getId());
			if (franja!=null)
				this.editarExcepcionHorario(excepcionHorario, franja, proveedor);
			else
				this.getProveedorBO().eliminarExcepcionHorario(excepcionHorario);
		}
		pos = 0;
		franja = req.getParameter("excepcionhorario_nueva_" + pos++);
		while (franja!=null)
		{
			ExcepcionHorario excepcionHorario = new ExcepcionHorario ();
			this.editarExcepcionHorario(excepcionHorario, franja, proveedor);
			franja = req.getParameter("excepcionhorario_nueva_" + pos++);
		}
	}
	
	private void editarFranja (FranjaHoraria franja, String of, Proveedor proveedor, String tipo) throws Exception
	{
		JSONObject jobject = new JSONObject (of);
		SimpleDateFormat sdf = new SimpleDateFormat ("HH:mm:ss");
		franja.setInicio(new Time (sdf.parse(jobject.getString("inicio")).getTime()));
		franja.setFin(new Time (sdf.parse(jobject.getString("fin")).getTime()));
		franja.setTipo(tipo);
		franja.setTodosLosDias(new Boolean(jobject.getString("todos")));
		franja.setLunes(new Boolean(jobject.getString("lunes")));
		franja.setMartes(new Boolean(jobject.getString("martes")));
		franja.setMiercoles(new Boolean(jobject.getString("miercoles")));
		franja.setJueves(new Boolean(jobject.getString("jueves")));
		franja.setViernes(new Boolean(jobject.getString("viernes")));
		franja.setSabado(new Boolean(jobject.getString("sabado")));
		franja.setDomingo(new Boolean(jobject.getString("domingo")));
		franja.setProveedor(proveedor);
				
		this.getProveedorBO().guardarFranjaHoraria(franja);
	}
	
	private void editarExcepcionHorario (ExcepcionHorario excepcion, String of, Proveedor proveedor) throws Exception
	{
		JSONObject jobject = new JSONObject (of);
		SimpleDateFormat sdf = new SimpleDateFormat ("HH:mm:ss");
		SimpleDateFormat sdf2 = new SimpleDateFormat("dd/MM/yyyy");
		
		excepcion.setFecha(sdf2.parse(jobject.getString("fecha")));
		excepcion.setCerrado(new Boolean(jobject.getString("cerrado")));
		excepcion.setInicio(null);
		String inicio = jobject.getString("inicio");
		if (!inicio.equals(""))
			excepcion.setInicio(new Time (sdf.parse(inicio).getTime()));
		excepcion.setFin(null);
		String fin = jobject.getString("fin");
		if (!fin.equals(""))
			excepcion.setFin(new Time (sdf.parse(fin).getTime()));
				
		excepcion.setProveedor(proveedor);
				
		this.getProveedorBO().guardarExcepcionHorario(excepcion);
	}
	
	private void saveServicios (HttpServletRequest req, Proveedor proveedor)
	{
		TabGenerico tab = proveedor.getVistaConsumidor().getTabs().get(4);
		List<ServicioProveedor> lserv = new ArrayList<ServicioProveedor>();
		lserv.addAll(((TabServicios)tab).getServicios());
		Iterator<ServicioProveedor> itServicios = lserv.iterator();
		while (itServicios.hasNext())
		{
			ServicioProveedor servicio = itServicios.next();
			String serv = req.getParameter("servicio_" + servicio.getId());
			if (serv==null)
				((TabServicios)tab).getServicios().remove(servicio);
		}
		int pos = 0;
		String serv = req.getParameter("servicio_nuevo_" + pos++);
		while (serv!=null)
		{
			ServicioProveedor servicio = this.getVistaBO().getServicioById(new Long(serv));
			((TabServicios)tab).getServicios().add(servicio);			
			serv = req.getParameter("servicio_nuevo_" + pos++);
		}
		this.getVistaBO().guardar(tab);
		this.getVistaBO().refrescar(tab);
	}
	
	private void saveRubros (HttpServletRequest req, Proveedor proveedor)
	{
		List<Rubro> lserv = new ArrayList<Rubro>();
		lserv.addAll(proveedor.getRubros());
		Iterator<Rubro> itRubros = lserv.iterator();
		while (itRubros.hasNext())
		{
			Rubro rubro = itRubros.next();
			String serv = req.getParameter("rubro_" + rubro.getId());
			if (serv==null)
				proveedor.getRubros().remove(rubro);
		}
		int pos = 0;
		String serv = req.getParameter("rubro_nuevo_" + pos++);
		while (serv!=null)
		{
			Rubro rubro = this.getProveedorBO().getRubroById(serv);
			proveedor.getRubros().add(rubro);			
			serv = req.getParameter("rubro_nuevo_" + pos++);
		}
	}
	
	private void saveSucursales (HttpServletRequest req, Proveedor proveedor)
	{
		try{
			if(!req.getParameter("listaP").toString().equals("")){
				JSONArray jsonArraySucursales = new JSONArray(req.getParameter("listaP").toString());
				TabGenerico tab = proveedor.getVistaConsumidor().getTabs().get(3);//mapa
				for (int i=0; i<jsonArraySucursales.length(); i++){
					 JSONObject rec = jsonArraySucursales.getJSONObject(i);
					 String idPunto	= rec.getString("id");
					 String accion	= rec.getString("accion") + "";
					 Punto oPunto = null; 
					 if(accion.equals("ELIMINARPUNTO")) {
						 log.debug("eliminando punto " + idPunto);
						 oPunto = vistaBO.getPuntoById(new Long(idPunto));
						 this.vistaBO.eliminar(oPunto);
					 }else{
						 String nombre 	= rec.getString("nombre");
						 String latitud	= rec.getString("latitud");
						 String longitud= rec.getString("longitud");
						 String icono	= rec.getString("icono");
						 String descripcion	= rec.getString("descripcion");
						 
						 boolean verificarUbicacion = false;
						 if(accion.equals("AGREGARPUNTO")) {
							 oPunto  = new Punto();
							 verificarUbicacion = true;
						 }else if(accion.equals("MODIFICARPUNTO")) {
							 oPunto = vistaBO.getPuntoById(new Long(idPunto));

							 if( (oPunto.getLatitud().equals( latitud ) == false) || (oPunto.getLongitud().equals( longitud) == false) )
								 verificarUbicacion = true;
						 }
						 oPunto.setDescripcion(descripcion);
						 oPunto.setIcono(new Integer(icono));
						 oPunto.setLatitud(latitud);
						 oPunto.setLongitud(longitud);
						 oPunto.setNombre(nombre);
						 oPunto.setTabGenerico(tab);
						 
						 // VERIFICA LA UBICACION SI ES NECESARIO
						 if( verificarUbicacion == true )
						 {
							Ubicacion ubicacion = GeoCoderRequest.getInstance().getUbicacion(Double.parseDouble(latitud), Double.parseDouble(longitud));
							oPunto.setUbicacion( ubicacion );
						 }

						 this.vistaBO.guardar(oPunto);
						 JSONArray zonaJSON = rec.getJSONArray("zona");
						 if (zonaJSON.length() == 0) {//no tiene zona o se eliminar
							 oPunto.getZona().clear();
						 } else {//se agregar zona o se modifica
							 Zona zona = null;
							 JSONObject oZona = zonaJSON.getJSONObject(0);
							 Long zonaId 		= Long.parseLong(oZona.getString("id"));
							 String zonaNombre 	= oZona.getString("nombre");
							 String zonaDescripcion	= oZona.getString("descripcion");
							 String zonaColor 	= oZona.getString("color");
							 JSONArray listaPuntosJSON 	= oZona.getJSONArray("listaPuntos");
							 if (zonaId < 0) {
								 zona = new Zona();
							 } else {
								 zona = this.vistaBO.getZonaById(zonaId);
								 zona.getListaPuntos().clear();
							 }
							 //Setear zona
							 zona.setColor(zonaColor);
							 zona.setNombre(zonaNombre);
							 zona.setDescripcion(zonaDescripcion);
							 for (int j=0; j<listaPuntosJSON.length(); j++){
								 PuntosZona puntosZona = new PuntosZona();
								 JSONObject oPuntosZona = listaPuntosJSON.getJSONObject(j);
								 puntosZona.setLatitud(oPuntosZona.getString("latitud"));
								 puntosZona.setLongitud(oPuntosZona.getString("longitud"));
								 puntosZona.setZona(zona);
								 zona.getListaPuntos().add(puntosZona);
							 }
							 
							 oPunto.getZona().add(zona);
						 }
						 this.vistaBO.guardar(oPunto);
					 }
				}
			}
		}catch (JSONException e) {
			// TODO: handle exception
			System.out.println(e.getMessage());
		}
		//this.getVistaBO().refrescar(tab);
	}
	
	private void saveAdminSite (HttpServletRequest req, Proveedor proveedor, String idProveedor)
	{
		String duenio = req.getParameter("duenio");
		this.saveAdministradores(req, proveedor, idProveedor, duenio);
		this.saveOperadores(req, proveedor, idProveedor, duenio);
		this.saveUsuarios(req, proveedor, idProveedor, duenio);
		if (duenio!=null)
		{
			Usuario usuario = this.getUsuarioBO().getUsuarioById(duenio);
			if (!usuario.getProveedoresAdministrados().contains(proveedor))
				usuario.getProveedoresAdministrados().add(proveedor);
			if (!usuario.getProveedoresOperados().contains(proveedor))
			{
				usuario.getProveedoresOperados().add(proveedor);
				UsuarioProveedorEstado upe = this.getUsuarioBO().getUsuarioProveedorEstadoByUsuarioAndProveedor(usuario.getId().toString(), idProveedor);
				if (upe==null)
				{
					upe = new UsuarioProveedorEstado ();
					upe.setUsuario(usuario);
					upe.setProveedor(proveedor);
					upe.setPedidosPendientes(false);
					upe.setCantPedidosPendientes(0);
					upe.setEnMostrador(new Boolean (false));
					upe.setPerrID(null);
					upe.setAtendidoPor(null);
					upe.setRanking(new Long(1));
				}
				else
					upe.setEnMostrador(new Boolean (false));
				this.getUsuarioBO().guardarUsuarioProveedorEstado(upe);
			}
			if (!usuario.getProveedoresUsuario().contains(proveedor))
				usuario.getProveedoresUsuario().add(proveedor);
			this.getUsuarioBO().guardarUsuario(usuario);
			proveedor.setDuenio(usuario);
		}
	}
	
	private void saveAdministradores (HttpServletRequest req, Proveedor proveedor, String idProveedor, String duenio)
	{
		String duenioAnt = req.getParameter("duenioAnt");
		Iterator<Usuario> itUsuarios = this.getUsuarioBO().getAdministradoresNotUsuarioByProveedorOrderByMail(idProveedor, duenio).iterator();
		while (itUsuarios.hasNext())
		{
			Usuario usuario = itUsuarios.next();
			String admin = req.getParameter("administrador_" + usuario.getId());
			if (admin==null && !usuario.getId().toString().equals(duenioAnt))
			{
				usuario.getProveedoresAdministrados().remove(proveedor);
				this.getUsuarioBO().guardarUsuario(usuario);
			}
		}
		int i = 0;
		String adminNuevo = req.getParameter("administrador_nuevo_" + i++);
		while (adminNuevo!=null)
		{
			Usuario usuario = this.getUsuarioBO().getUsuarioById(adminNuevo);
			usuario.getProveedoresAdministrados().add(proveedor);
			this.getUsuarioBO().guardarUsuario(usuario);
			adminNuevo = req.getParameter("administrador_nuevo_" + i++);
		}
	}
	
	private void saveOperadores (HttpServletRequest req, Proveedor proveedor, String idProveedor, String duenio)
	{
		String duenioAnt = req.getParameter("duenioAnt");
		Iterator<Usuario> itUsuarios = this.getUsuarioBO().getOperadoresNotUsuarioByProveedorOrderByMail(idProveedor, duenio).iterator();
		while (itUsuarios.hasNext())
		{
			Usuario usuario = itUsuarios.next();
			String oper = req.getParameter("operador_" + usuario.getId());
			if (oper==null && !usuario.getId().toString().equals(duenioAnt))
			{
				usuario.getProveedoresOperados().remove(proveedor);
				this.getUsuarioBO().guardarUsuario(usuario);
				UsuarioProveedorEstado upe = this.getUsuarioBO().getUsuarioProveedorEstadoByUsuarioAndProveedor(usuario.getId().toString(), idProveedor);
				upe.setEnMostrador(null);
				this.getUsuarioBO().guardarUsuarioProveedorEstado(upe);
			}
		}
		int i = 0;
		String operNuevo = req.getParameter("operador_nuevo_" + i++);
		while (operNuevo!=null)
		{
			Usuario usuario = this.getUsuarioBO().getUsuarioById(operNuevo);
			usuario.getProveedoresOperados().add(proveedor);
			this.getUsuarioBO().guardarUsuario(usuario);
			UsuarioProveedorEstado upe = this.getUsuarioBO().getUsuarioProveedorEstadoByUsuarioAndProveedor(operNuevo, idProveedor);
			if (upe==null)
			{
				upe = new UsuarioProveedorEstado ();
				upe.setUsuario(usuario);
				upe.setProveedor(proveedor);
				upe.setPedidosPendientes(false);
				upe.setCantPedidosPendientes(0);
				upe.setEnMostrador(new Boolean (false));
				upe.setPerrID(null);
				upe.setAtendidoPor(null);
				upe.setRanking(new Long(1));
			}
			else
				upe.setEnMostrador(new Boolean (false));
			this.getUsuarioBO().guardarUsuarioProveedorEstado(upe);
			operNuevo = req.getParameter("operador_nuevo_" + i++);
		}
	}
	
	private void saveUsuarios (HttpServletRequest req, Proveedor proveedor, String idProveedor, String duenio)
	{
		String duenioAnt = req.getParameter("duenioAnt");
		Iterator<Usuario> itUsuarios = this.getUsuarioBO().getUsuariosNotUsuarioByProveedorOrderByMail(idProveedor, duenio).iterator();
		while (itUsuarios.hasNext())
		{
			Usuario usuario = itUsuarios.next();
			String admin = req.getParameter("administrador_" + usuario.getId());
			String oper = req.getParameter("operador_" + usuario.getId());
			if (admin==null && oper==null && !usuario.getId().toString().equals(duenioAnt))
			{
				usuario.getProveedoresUsuario().remove(proveedor);
				this.getUsuarioBO().guardarUsuario(usuario);
			}
		}
		int i = 0;
		String adminNuevo = req.getParameter("administrador_nuevo_" + i++);
		while (adminNuevo!=null)
		{
			Usuario usuario = this.getUsuarioBO().getUsuarioById(adminNuevo);
			usuario.getProveedoresUsuario().add(proveedor);
			this.getUsuarioBO().guardarUsuario(usuario);
			adminNuevo = req.getParameter("administrador_nuevo_" + i++);
		}
		i = 0;
		String operNuevo = req.getParameter("operador_nuevo_" + i++);
		while (operNuevo!=null)
		{
			Usuario usuario = this.getUsuarioBO().getUsuarioById(operNuevo);
			if (!usuario.getProveedoresUsuario().contains(proveedor))
			{
				usuario.getProveedoresUsuario().add(proveedor);
				this.getUsuarioBO().guardarUsuario(usuario);
			}
			operNuevo = req.getParameter("operador_nuevo_" + i++);
		}
	}
	
	private void saveNotificaciones (HttpServletRequest req, Proveedor proveedor) throws JSONException
	{
		JSONArray arrayNot = new JSONArray (req.getParameter("notificaciones").toString());
		Hashtable hashNot = new Hashtable ();
		for (int i=0; i<arrayNot.length(); i++)
		{
			JSONObject job = arrayNot.getJSONObject(i);
			hashNot.put(job.get("id"), job);
		}
		Iterator<TipoSucesoProveedor> itSucesos = proveedor.getTiposSuceso().iterator();
		while (itSucesos.hasNext())
		{
			TipoSucesoProveedor sucesoProveedor = itSucesos.next();
			String id = sucesoProveedor.getTipoSuceso().getId().toString();
			JSONObject job = (JSONObject) hashNot.get(id);
			if (job != null)
			{
				sucesoProveedor.setNotificableMail(new Boolean(job.getString("mail")));
				sucesoProveedor.setNotificableSMS(new Boolean(job.getString("sms")));
				this.saveUsuariosNotif(job, sucesoProveedor);
				this.getProveedorBO().guardarTipoSucesoProveedor(sucesoProveedor);
				hashNot.remove(id);
			}
			else
				this.getProveedorBO().eliminarTipoSucesoProveedor(sucesoProveedor);
		}
		Enumeration<JSONObject> enSucesos = hashNot.elements();
		while (enSucesos.hasMoreElements())
		{
			JSONObject job = enSucesos.nextElement();
			TipoSucesoProveedor sucesoProveedor = new TipoSucesoProveedor ();
			sucesoProveedor.setNotificableMail(new Boolean(job.getString("mail")));
			sucesoProveedor.setNotificableSMS(new Boolean(job.getString("sms")));
			this.saveUsuariosNotif(job, sucesoProveedor);
			TipoSuceso tipoSuceso = this.getSucesosBO().getTipoSucesoById(job.getString("id"));
			sucesoProveedor.setTipoSuceso(tipoSuceso);
			sucesoProveedor.setProveedor(proveedor);
			this.getProveedorBO().guardarTipoSucesoProveedor(sucesoProveedor);
		}
	}
	
	private void saveUsuariosNotif (JSONObject job, TipoSucesoProveedor sucesoProveedor) throws JSONException
	{
		sucesoProveedor.getUsuarios().clear();
		JSONArray arrayUs = job.getJSONArray("usuarios");
		for (int i=0; i<arrayUs.length(); i++)
		{
			JSONObject ob = arrayUs.getJSONObject(i);
			Usuario usuario = this.getUsuarioBO().getUsuarioById(ob.getString("id"));
			sucesoProveedor.getUsuarios().add(usuario);
		}
	}
	
	private void saveTabs (HttpServletRequest req, Proveedor proveedor)
	{
		String fact = req.getParameter("tabs_fotos_activa");
		String fdef = req.getParameter("tabs_fotos_defecto");
		String iact = req.getParameter("tabs_info_activa");
		String idef = req.getParameter("tabs_info_defecto");
		String mact = req.getParameter("tabs_mapa_activa");
		String mdef = req.getParameter("tabs_mapa_defecto");
		String sact = req.getParameter("tabs_servicios_activa");
		String sdef = req.getParameter("tabs_servicios_defecto");
		String cact = req.getParameter("tabs_cupon_activa");
		String cdef = req.getParameter("tabs_cupon_defecto");
		String cartadef = req.getParameter("tabs_carta_defecto");
		String thumbsact = req.getParameter("tabs_thumbs_activa");
		String thumbsdef = req.getParameter("tabs_thumbs_defecto");
		String detact = req.getParameter("tabs_det_activa");
		String detdef = req.getParameter("tabs_det_defecto");
		
		List<TabGenerico> tabs = proveedor.getVistaConsumidor().getTabs();
		TabGenerico tabFotos = tabs.get(0);
		TabGenerico tabInfo = tabs.get(2);
		TabGenerico tabMapa = tabs.get(3);
		TabGenerico tabServicios = tabs.get(4);
		TabGenerico tabCupon = tabs.get(5);
		
		tabFotos.setActivo(new Boolean(fact));
		tabFotos.setPorDefecto(new Boolean(fdef));
		tabInfo.setActivo(new Boolean(iact));
		tabInfo.setPorDefecto(new Boolean(idef));
		tabMapa.setActivo(new Boolean(mact));
		tabMapa.setPorDefecto(new Boolean(mdef));
		tabServicios.setActivo(new Boolean(sact));
		tabServicios.setPorDefecto(new Boolean(sdef));
		tabCupon.setActivo(new Boolean(cact));
		tabCupon.setPorDefecto(new Boolean(cdef));
		
		this.getVistaBO().guardar(tabFotos);
		this.getVistaBO().guardar(tabInfo);
		this.getVistaBO().guardar(tabMapa);
		this.getVistaBO().guardar(tabServicios);
		this.getVistaBO().guardar(tabCupon);
		
		VistaProductos vistaProductos = ((ProveedorProductos)proveedor).getVistaProductos();
		vistaProductos.setVistaCartaPorDefecto(new Boolean(cartadef));
		vistaProductos.setVistaThumbsPorDefecto(new Boolean(thumbsdef));
		vistaProductos.setVistaThumbsActiva(new Boolean(thumbsact));
		vistaProductos.setVistaBigPorDefecto(new Boolean(detdef));
		vistaProductos.setVistaBigActiva(new Boolean(detact));
		this.getProveedorBO().guardarVistaProductos(vistaProductos);
	}
	
	private Cupon saveCupon (HttpServletRequest req, Proveedor proveedor) throws JSONException, ParseException
	{
		String idCuponEliminado = req.getParameter("cupon_eliminado");
		if (idCuponEliminado != null)
		{
			Cupon cupon = this.getProductoBO().getCuponById(idCuponEliminado);
			this.getProductoBO().eliminarCupon(cupon);
		}
		if(!req.getParameter("cupon").toString().equals(""))
		{
			
			JSONObject jobject = new JSONObject (req.getParameter("cupon").toString());
			Cupon cupon = new Cupon();
			cupon.setCodigo(jobject.getString("codigo"));
			cupon.setNombre(jobject.getString("nombre"));
			cupon.setDescripcion(jobject.getString("descripcion"));
			cupon.setCondiciones(jobject.getString("condiciones"));
			cupon.setPrecio(new Double(jobject.getString("precio")));
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
			cupon.setInicio(sdf.parse((jobject.getString("inicio"))));
			cupon.setFin(sdf.parse((jobject.getString("fin"))));
			cupon.setMinimo(new Integer(jobject.getString("minimo")));
			cupon.setMaximo(new Integer(jobject.getString("maximo")));
			String idImagen = jobject.getString("idImagen");
			if (!idImagen.equals(""))
			{
				ImagenProducto imagen = this.getProductoBO().getImagenProductoById(idImagen);
				cupon.setImagen(imagen);
			}
			Producto producto = this.getProductoBO().getProductoById(jobject.getString("idProducto"));
			cupon.setProducto(producto);
			cupon.setProveedor(proveedor);
			cupon.setPrecioProducto(producto.getPrecio());
			this.getProductoBO().guardarCupon(cupon);
			return cupon;
		}
		return this.getProductoBO().getLastCuponByProveedor(proveedor.getId().toString());
	}
	
	private void savePublicidades (HttpServletRequest req, String idProveedor, Proveedor proveedor) throws Exception
	{
		Iterator<Publicidad> itPublicidades = this.getProveedorBO().getPublicidadesByProveedorOrderByTitulo(idProveedor).iterator();
		while (itPublicidades.hasNext())
		{
			Publicidad publicidad = itPublicidades.next();
			String pub = req.getParameter("publicidad_" + publicidad.getId());
			if (pub!=null)
				this.editarPublicidad(publicidad, pub, idProveedor);
			else
			{
				Imagen imagen = publicidad.getImagen();
				this.getProveedorBO().eliminarImagen(imagen);
				this.getProveedorBO().eliminarPublicidad(publicidad);
			}
		}
		int pos = 0;
		String pub = req.getParameter("publicidad_nueva_" + pos++);
		while (pub!=null)
		{
			this.crearPublicidad(pub, idProveedor, proveedor);
			pub = req.getParameter("publicidad_nueva_" + pos++);
		}
		pos = 0;
		String img = req.getParameter("imgborrada_" + pos++);
		while (img!=null)
		{
			File file = (File) FileUploadManager.getInstance().getFiles().get(img);
			if (file!=null)
			{
				file.delete();
				FileUploadManager.getInstance().getFiles().remove(img);
			}
			img = req.getParameter("imgborrada_" + pos++);
		}
	}
	
	private void saveOfertas (HttpServletRequest req, String idProveedor, Proveedor proveedor) throws Exception
	{
		Iterator<Oferta> itOfertas = this.getProductoBO().getOfertasByProveedor(idProveedor).iterator();
		while (itOfertas.hasNext())
		{
			Oferta oferta = itOfertas.next();
			String of = req.getParameter("oferta_" + oferta.getId());
			if (of!=null)
				this.editarOferta(oferta, of, proveedor);
			else
				this.getProductoBO().eliminarOferta(oferta);
		}
		int pos = 0;
		String of = req.getParameter("oferta_nueva_" + pos++);
		while (of!=null)
		{
			Oferta oferta = new Oferta ();
			this.editarOferta(oferta, of, proveedor);
			of = req.getParameter("oferta_nueva_" + pos++);
		}
	}
	
	private void editarOferta (Oferta oferta, String of, Proveedor proveedor) throws Exception
	{
		JSONObject jobject = new JSONObject (of);
		oferta.setCodigo(jobject.getString("codigo"));
		oferta.setNombre(jobject.getString("nombre"));
		oferta.setDescripcion(jobject.getString("descripcion"));
		oferta.setPrecio(new Double(jobject.getString("precio")));
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		oferta.setInicio(null);
		String inicio = jobject.getString("inicio");
		if (!inicio.equals(""))
			oferta.setInicio(sdf.parse(inicio));
		oferta.setFin(null);
		String fin = jobject.getString("fin");
		if (!fin.equals(""))
			oferta.setFin(sdf.parse(fin));
				
		oferta.setStock(null);
		String stock = jobject.getString("stock");
		if (!stock.equals(""))
			oferta.setStock(new Integer(stock));
		
		oferta.setActiva(new Boolean(jobject.getString("activa")));
		
		oferta.setLunes(new Boolean(jobject.getString("lunes")));
		oferta.setMartes(new Boolean(jobject.getString("martes")));
		oferta.setMiercoles(new Boolean(jobject.getString("miercoles")));
		oferta.setJueves(new Boolean(jobject.getString("jueves")));
		oferta.setViernes(new Boolean(jobject.getString("viernes")));
		oferta.setSabado(new Boolean(jobject.getString("sabado")));
		oferta.setDomingo(new Boolean(jobject.getString("domingo")));
				
		String idImagen = jobject.getString("idImagen");
		if (!idImagen.equals(""))
		{
			ImagenProducto imagen = this.getProductoBO().getImagenProductoById(idImagen);
			oferta.setImagen(imagen);
		}
		Producto producto = this.getProductoBO().getProductoById(jobject.getString("idProducto"));
		oferta.setProducto(producto);
		oferta.setProveedor(proveedor);
		this.getProductoBO().guardarOferta(oferta);
	}
	
	private void editarPublicidad (Publicidad publicidad, String pub, String idProveedor) throws Exception
	{
		int index = pub.indexOf("#@#@#@");
		String titulo = pub.substring(0,index);
		publicidad.setTitulo(titulo);
		pub = pub.substring(index+6);
		
		index = pub.indexOf("#@#@#@");
		String info = pub.substring(0,index);
		publicidad.setInfo(info);
		pub = pub.substring(index+6);
		
		index = pub.indexOf("#@#@#@");
		String descripcion = pub.substring(0,index);
		publicidad.setDescripcion(descripcion);
		pub = pub.substring(index+6);
		
		index = pub.indexOf("#@#@#@");
		String activa = pub.substring(0,index);
		publicidad.setActiva(new Boolean(activa));
		pub = pub.substring(index+6);
		
		File file = (File) FileUploadManager.getInstance().getFiles().get("publicidad_" + publicidad.getId() + "_" + idProveedor + "_");
		if (file!=null)
		{
			if (pub.equals(file.getName()) && !pub.equals(""))
			{
				File fileResized = FileUploadManager.getInstance().resizeImage(file);
				Imagen imagen = publicidad.getImagen();
				if (imagen!=null)
				{
					imagen.setFile(FileUploadManager.getInstance().getBytesFile(fileResized));
					imagen.setFileName(pub);
				}
				else
				{
					imagen = new Imagen ();
					imagen.setFile(FileUploadManager.getInstance().getBytesFile(fileResized));
					imagen.setFileName(pub);
					publicidad.setImagen(imagen);
				}
				fileResized.delete();
				this.getProveedorBO().guardarImagen(imagen);
			}
			file.delete();
			FileUploadManager.getInstance().getFiles().remove("publicidad_" + publicidad.getId() + "_" + idProveedor + "_");
		}
		
		this.getProveedorBO().guardarPublicidad(publicidad);
	}
	
	private void crearPublicidad (String pub, String idProveedor, Proveedor proveedor) throws Exception
	{
		Publicidad publicidad = new Publicidad ();
		
		int index = pub.indexOf("#@#@#@");
		String titulo = pub.substring(0,index);
		publicidad.setTitulo(titulo);
		pub = pub.substring(index+6);
		
		index = pub.indexOf("#@#@#@");
		String info = pub.substring(0,index);
		publicidad.setInfo(info);
		pub = pub.substring(index+6);
		
		index = pub.indexOf("#@#@#@");
		String descripcion = pub.substring(0,index);
		publicidad.setDescripcion(descripcion);
		pub = pub.substring(index+6);
		
		index = pub.indexOf("#@#@#@");
		String activa = pub.substring(0,index);
		publicidad.setActiva(new Boolean(activa));
		pub = pub.substring(index+6);
		
		index = pub.indexOf("#@#@#@");
		String img = pub.substring(0,index);
		pub = pub.substring(index+6);
		
		File file = (File) FileUploadManager.getInstance().getFiles().get("publicidad_" + pub + "_" + idProveedor + "_");
		if (file!=null)
		{
			if (img.equals(file.getName()) && !img.equals(""))
			{
				File fileResized = FileUploadManager.getInstance().resizeImage(file);
				Imagen imagen = new Imagen ();
				imagen.setFile(FileUploadManager.getInstance().getBytesFile(fileResized));
				imagen.setFileName(img);
				publicidad.setImagen(imagen);
				this.getProveedorBO().guardarImagen(imagen);
				fileResized.delete();
			}
			file.delete();
			FileUploadManager.getInstance().getFiles().remove("publicidad_" + pub + "_" + idProveedor + "_");
		}
		
		publicidad.setProveedor(proveedor);
		
		this.getProveedorBO().guardarPublicidad(publicidad);
	}
	
	private String getPublicidades (List<Publicidad> publicidades)
	{
		StringBuffer texto = new StringBuffer("");
		Iterator<Publicidad> itPublicidades = publicidades.iterator();
		int i=0;
		while (itPublicidades.hasNext())
		{
			Publicidad publicidad = itPublicidades.next();
			String checked = "";
			if (publicidad.getActiva())
				checked = "checked";
			String fn = "";
			if (publicidad.getImagen()!=null)
				fn = publicidad.getImagen().getFileName();
			texto.append("" +
				"<li class='sk1' id='" + publicidad.getId() + "'>" +
					"<a class='delete' onclick='configuracionSitio.borrarPublicidad($(this))'></a>" +
					"<a class='edit' onclick='configuracionSitio.bajarEditarPublicidad($(this))'></a>" +
					"<input type='checkbox' " + checked + ">" +
					"<h11 style='padding:0px 5px 3px 0px; float:left; display:inline; margin-top: -1px;  margin-left: 5px;'>" + publicidad.getTitulo() + "</h11>" +
					"<span id='descripcionpub' style='display:none'>" + publicidad.getDescripcion() + "</span>" +
					"<span id='infopub' style='display:none'>" + publicidad.getInfo() + "</span>" +
					"<span id='imagenpub' style='display:none'>" + fn + "</span>" +
					"<span id='activapub' style='display:none'>" + publicidad.getActiva() + "</span>" +
				"</li>");
		}
		return texto.toString();
	}
	
	private String[][] getOfertas (List<Oferta> ofertas)
	{
		StringBuffer texto = new StringBuffer("");
		String[][] aofertas = new String[ofertas.size()][20];
		Iterator<Oferta> itOfertas = ofertas.iterator();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		int i=0;
		while (itOfertas.hasNext())
		{
			Oferta oferta = itOfertas.next();
			String checked = "";
			if (oferta.getActiva())
				checked = "checked";
			texto.append("<li class='sk1' id='" + oferta.getId() + "'><a class='delete' href='#' onclick='configuracionSitio.borrarOferta($(this))'></a><a class='edit' href='#' onclick='configuracionSitio.bajarEditarOferta($(this))'></a><input type='checkbox' " + checked + "><h11 style='padding:0px 5px 3px 0px; float:left; display:inline; margin-top: -1px;  margin-left: 5px;'>" + oferta.getNombre() + "</h11></li>");
			Producto producto = oferta.getProducto();
			ImagenProducto image = oferta.getImagen();
			aofertas[i][0] = oferta.getId().toString();
			aofertas[i][1] = oferta.getCodigo();
			aofertas[i][2] = oferta.getNombre();
			aofertas[i][3] = oferta.getDescripcion();
			
			aofertas[i][4] = "";
			if (oferta.getStock() != null)
				aofertas[i][4] = oferta.getStock().toString();

			aofertas[i][5] = oferta.getPrecio().toString();
			
			aofertas[i][6] = "";
			if (oferta.getInicio() != null)
				aofertas[i][6] = sdf.format(oferta.getInicio());
			aofertas[i][7] = "";
			if (oferta.getFin() != null)
				aofertas[i][7] = sdf.format(oferta.getFin());
			
			aofertas[i][8] = oferta.getActiva().toString();
			aofertas[i][9] = producto.getId().toString();
			aofertas[i][10] = producto.getNombre().toString();
			aofertas[i][11] = image.getId().toString();
			aofertas[i][12] = image.getFileName();
			
			aofertas[i][13] = oferta.getLunes().toString();
			aofertas[i][14] = oferta.getMartes().toString();
			aofertas[i][15] = oferta.getMiercoles().toString();
			aofertas[i][16] = oferta.getJueves().toString();
			aofertas[i][17] = oferta.getViernes().toString();
			aofertas[i][18] = oferta.getSabado().toString();
			aofertas[i++][19] = oferta.getDomingo().toString();
		}
		this.setSetOfertas(texto.toString());
		return aofertas;
	}
	
	private String[][] getCupones (List<Cupon> cupones)
	{
		StringBuffer texto = new StringBuffer("");
		String[][] acupones = new String[cupones.size()][19];
		Iterator<Cupon> itCupones = cupones.iterator();
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
		int i=0;
		while (itCupones.hasNext())
		{
			Cupon cupon = itCupones.next();
			String estado = BuymanHelper.getInstance().getEstadoValorCupon(cupon);
			String eliminarCupon = "";
			if (estado.equals("0"))
				eliminarCupon = "<a class='delete' onclick='configuracionSitio.eliminarCupon($(this))'></a>";
			Producto producto = cupon.getProducto();
			ImagenProducto image = cupon.getImagen();
			texto.append("<li class='sk1' id='" + cupon.getId() + "'>" + eliminarCupon + "<a class='view' onclick='configuracionSitio.verCupon($(this))'></a><h11>" + cupon.getNombre() + "</h11></li>");
			acupones[i][0] = cupon.getId().toString();
			acupones[i][1] = cupon.getCodigo();
			acupones[i][2] = cupon.getNombre();
			acupones[i][3] = cupon.getDescripcion();
			acupones[i][4] = cupon.getCondiciones();
			acupones[i][5] = cupon.getPrecio().toString();
			acupones[i][6] = sdf.format(cupon.getInicio());
			acupones[i][7] = sdf.format(cupon.getFin());
			acupones[i][8] = cupon.getMinimo().toString();
			acupones[i][9] = cupon.getMaximo().toString();
			acupones[i][10] = producto.getId().toString();
			acupones[i][11] = producto.getNombre().toString();
			acupones[i][12] = cupon.getPrecioProducto().toString();
			if (image!=null)
			{
				acupones[i][13] = image.getId().toString();
				acupones[i][14] = image.getFileName();
			}
			else
			{
				acupones[i][13] = "";
				acupones[i][14] = "";
			}
			acupones[i][15] = BuymanHelper.getInstance().getEstadoCupon(cupon).toUpperCase();
			acupones[i][16] = BuymanHelper.getInstance().getEstadoValorCupon(cupon);
			acupones[i][17] = cupon.getFin().toGMTString();
			acupones[i++][18] = "" + cupon.getUsuarios().size();
		}
		this.setSetCupones(texto.toString());
		return acupones;
	}
	
	private void cancelarPublicidades (HttpServletRequest req)
	{
		String idProveedor = req.getParameter("idProveedor");
		int pos=0;
		String img = req.getParameter("img_" + pos++);
		while (img!=null)
		{
			File file = (File) FileUploadManager.getInstance().getFiles().get(img);
			if (file!=null)
			{
				file.delete();
				FileUploadManager.getInstance().getFiles().remove(img);
			}
			img = req.getParameter("img_" + pos++);
		}
		File file = (File) FileUploadManager.getInstance().getFiles().get("logo_" + idProveedor + "_");
		if (file!=null)
		{
			file.delete();
			FileUploadManager.getInstance().getFiles().remove("logo_" + idProveedor + "_");
		}
		
		req.getSession().setAttribute("idProveedor", idProveedor);
		req.getSession().setAttribute("filtroProductos", "");
		req.getSession().setAttribute("filtroProducto", "");
		req.getSession().setAttribute("modo", "vista");
	}
	
	private void searchUsuarios (HttpServletRequest req, HttpServletResponse res) throws IOException
	{
		String idDuenio = req.getParameter("idDuenio");
		String lim = req.getParameter("act_limit");
		int limit=0;
		if (lim!= null)
			limit = Integer.decode(lim);
		String search = req.getParameter("act_search");
		
		JSONArray array = new JSONArray ();
		
		Collection ids = new ArrayList();
		Collection valores = new ArrayList ();
		
		List<Usuario> usuarios;
		if (search.equals(""))
			usuarios = this.getUsuarioBO().getUsuariosNotUsuarioOrderByMail(limit, idDuenio);
		else
			usuarios = this.getUsuarioBO().getUsuariosNotUsuarioLikeMailOrderByMail(search, limit, idDuenio);
		for (int i=0; i<usuarios.size(); i++)
		{
			Usuario usuario = usuarios.get(i);
			ids.add(usuario.getId());
			valores.add(usuario.getMail());
		}

		array.put(ids);
		array.put(valores);
		
		XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
		xstream.setMode(XStream.NO_REFERENCES);
		String result = xstream.toXML(array);
		result = result.substring(result.indexOf("myArrayList") + 14);// TODO basura
		res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate,post-check=0, pre-check=0");
		res.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
		res.getWriter().write(result.substring(0, result.length() - 2));// TODO basura
	}
	
	private void searchUsuariosProveedor (HttpServletRequest req, HttpServletResponse res) throws IOException
	{
		String idProveedor = req.getParameter("idProveedor");
		String lim = req.getParameter("act_limit");
		int limit=0;
		if (lim!= null)
			limit = Integer.decode(lim);
		String search = req.getParameter("act_search");
		
		JSONArray array = new JSONArray ();
		
		Collection ids = new ArrayList();
		Collection valores = new ArrayList ();
		
		List<Usuario> usuarios;
		if (search.equals(""))
			usuarios = this.getUsuarioBO().getUsuariosByProveedorOrderByMail(idProveedor);
		else
			usuarios = this.getUsuarioBO().getUsuariosByProveedorLikeMailOrderByMail(search, limit, idProveedor);
		for (int i=0; i<usuarios.size(); i++)
		{
			Usuario usuario = usuarios.get(i);
			ids.add(usuario.getId());
			valores.add(usuario.getMail());
		}

		array.put(ids);
		array.put(valores);
		
		XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
		xstream.setMode(XStream.NO_REFERENCES);
		String result = xstream.toXML(array);
		result = result.substring(result.indexOf("myArrayList") + 14);// TODO basura
		res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate,post-check=0, pre-check=0");
		res.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
		res.getWriter().write(result.substring(0, result.length() - 2));// TODO basura
	}
	
	private void searchProductos (HttpServletRequest req, HttpServletResponse res) throws IOException
	{
		String idProveedor = req.getParameter("idProveedor");
		String lim = req.getParameter("act_limit");
		int limit=0;
		if (lim!= null)
			limit = Integer.decode(lim);
		String search = req.getParameter("act_search");
		
		JSONArray array = new JSONArray ();
		
		Collection ids = new ArrayList();
		Collection valores = new ArrayList ();
		Collection precios = new ArrayList ();
		Collection imagenes = new ArrayList ();
		Collection imagenesname = new ArrayList ();
		
		List<Producto> productos;
		if (search.equals(""))
			productos = this.getProductoBO().getProductosByProveedorOrderByNombre(limit, idProveedor);
		else
			productos = this.getProductoBO().getProductosLikeNombreByProveedorOrderByNombre(search, limit, idProveedor);
		for (int i=0; i<productos.size(); i++)
		{
			Producto producto = productos.get(i);
			ids.add(producto.getId());
			valores.add(producto.getNombre());
			precios.add(producto.getPrecio());
			if (producto.getImagen() != null)
			{
				imagenes.add(producto.getImagen().getId());
				imagenesname.add(producto.getImagen().getFileName());
			}
			else
			{
				imagenes.add("");
				imagenesname.add("");
			}
		}

		array.put(ids);
		array.put(valores);
		array.put(precios);
		array.put(imagenes);
		array.put(imagenesname);
		
		XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
		xstream.setMode(XStream.NO_REFERENCES);
		String result = xstream.toXML(array);
		result = result.substring(result.indexOf("myArrayList") + 14);// TODO basura
		res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate,post-check=0, pre-check=0");
		res.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
		res.getWriter().write(result.substring(0, result.length() - 2));// TODO basura
	}
	
	private void searchProductosOfertas (HttpServletRequest req, HttpServletResponse res) throws IOException
	{
		String idProveedor = req.getParameter("idProveedor");
		String lim = req.getParameter("act_limit");
		int limit=0;
		if (lim!= null)
			limit = Integer.decode(lim);
		String search = req.getParameter("act_search");
		
		JSONArray array = new JSONArray ();
		
		Collection ids = new ArrayList();
		Collection valores = new ArrayList ();
		Collection imagenes = new ArrayList ();
		Collection imagenesname = new ArrayList ();
		
		List<Producto> productos;
		if (search.equals(""))
			productos = this.getProductoBO().getProductosByProveedorOrderByNombre(limit, idProveedor);
		else
			productos = this.getProductoBO().getProductosLikeNombreByProveedorOrderByNombre(search, limit, idProveedor);
		for (int i=0; i<productos.size(); i++)
		{
			Producto producto = productos.get(i);
			ids.add(producto.getId());
			valores.add(producto.getNombre());
			if (producto.getImagen() != null)
			{
				imagenes.add(producto.getImagen().getId());
				imagenesname.add(producto.getImagen().getFileName());
			}
			else
			{
				imagenes.add("");
				imagenesname.add("");
			}
		}

		array.put(ids);
		array.put(valores);
		array.put(imagenes);
		array.put(imagenesname);
		
		XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
		xstream.setMode(XStream.NO_REFERENCES);
		String result = xstream.toXML(array);
		result = result.substring(result.indexOf("myArrayList") + 14);// TODO basura
		res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate,post-check=0, pre-check=0");
		res.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
		res.getWriter().write(result.substring(0, result.length() - 2));// TODO basura
	}
	
	private void getAdministradores (HttpServletRequest req, HttpServletResponse res) throws IOException
	{
		String idProveedor = req.getParameter("beanId");
		String idDuenio = req.getParameter("idDuenio");
		
		JSONArray array = new JSONArray ();
		
		Collection ids = new ArrayList();
		Collection valores = new ArrayList ();
		
		List<Usuario> usuarios = this.getUsuarioBO().getAdministradoresNotUsuarioByProveedorOrderByMail(idProveedor, idDuenio);
		for (int i=0; i<usuarios.size(); i++)
		{
			Usuario usuario = usuarios.get(i);
			ids.add(usuario.getId());
			valores.add(usuario.getMail());
		}

		array.put(ids);
		array.put(valores);
		
		XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
		xstream.setMode(XStream.NO_REFERENCES);
		String result = xstream.toXML(array);
		result = result.substring(result.indexOf("myArrayList") + 14);// TODO basura
		res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate,post-check=0, pre-check=0");
		res.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
		res.getWriter().write(result.substring(0, result.length() - 2));// TODO basura
	}
	
	private void getOperadores (HttpServletRequest req, HttpServletResponse res) throws IOException
	{
		String idProveedor = req.getParameter("beanId");
		String idDuenio = req.getParameter("idDuenio");
		
		JSONArray array = new JSONArray ();
		
		Collection ids = new ArrayList();
		Collection valores = new ArrayList ();
		
		List<Usuario> usuarios = this.getUsuarioBO().getOperadoresNotUsuarioByProveedorOrderByMail(idProveedor, idDuenio);
		for (int i=0; i<usuarios.size(); i++)
		{
			Usuario usuario = usuarios.get(i);
			ids.add(usuario.getId());
			valores.add(usuario.getMail());
		}

		array.put(ids);
		array.put(valores);
		
		XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
		xstream.setMode(XStream.NO_REFERENCES);
		String result = xstream.toXML(array);
		result = result.substring(result.indexOf("myArrayList") + 14);// TODO basura
		res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate,post-check=0, pre-check=0");
		res.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
		res.getWriter().write(result.substring(0, result.length() - 2));// TODO basura
	}
	
	private void getUsuariosNotif (HttpServletRequest req, HttpServletResponse res) throws IOException
	{
		String idProveedor = req.getParameter("beanId");
		String idTipoSuceso = req.getParameter("idTipoSuceso");
			
		JSONArray array = new JSONArray ();
		
		Collection ids = new ArrayList();
		Collection valores = new ArrayList ();
		
		List<Usuario> usuarios = this.getUsuarioBO().getUsuariosNotifByProveedorByTipoSucesoOrderByMail(idProveedor, idTipoSuceso);
		
		for (int i=0; i<usuarios.size(); i++)
		{
			Usuario usuario = usuarios.get(i);
			ids.add(usuario.getId());
			valores.add(usuario.getMail());
		}

		array.put(ids);
		array.put(valores);
		
		XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
		xstream.setMode(XStream.NO_REFERENCES);
		String result = xstream.toXML(array);
		result = result.substring(result.indexOf("myArrayList") + 14);// TODO basura
		res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate,post-check=0, pre-check=0");
		res.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
		res.getWriter().write(result.substring(0, result.length() - 2));// TODO basura
	}
	
	private void editarFotos (HttpServletRequest req, HttpServletResponse res) throws IOException
	{
		String idTab = req.getParameter("idTab");
		String idProveedor = req.getParameter("idProveedor");
		Iterator itImagenes = this.getVistaBO().getImagenesByTabImagen(idTab).iterator();
		TabGenerico tab = this.getVistaBO().getTabsGenericosByProveedor(idProveedor).get(0);
		while (itImagenes.hasNext())
		{
			ImagenTab imagen = (ImagenTab) itImagenes.next();
			String simagen = req.getParameter("id_" + imagen.getId());
			if (simagen!=null)
			{
				int index = simagen.lastIndexOf("_");
				String nombre = simagen.substring(0, index);
				String pos = simagen.substring(index+1);
				if (!nombre.equals(imagen.getFileName()) || !pos.equals(imagen.getPosicion().toString()))
				{
					imagen.setPosicion(new Integer(pos));
					this.getVistaBO().guardar(imagen);
				}
			}
			else
				this.getVistaBO().eliminar(imagen);
		}
		int i = 0;
		String imagenNueva = req.getParameter("imagen_nueva_" + i++);
		while (imagenNueva!=null)
		{
			ImagenTab imagen = new ImagenTab ();
			int index = imagenNueva.lastIndexOf("_");
			String nombre = imagenNueva.substring(0, index);
			String pos = imagenNueva.substring(index+1);
			imagen.setPosicion(new Integer(pos));
			imagen.setFileName(nombre);
			imagen.setTabImagen(tab);
			File file = (File) FileUploadManager.getInstance().getFiles().get(nombre);
			File fileResized = FileUploadManager.getInstance().resizeImageRotator(file);
			try {
				imagen.setFile(FileUploadManager.getInstance().getBytesFile(fileResized));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			fileResized.delete();
			file.delete();
			FileUploadManager.getInstance().getFiles().remove(nombre);
			this.getVistaBO().guardar(imagen);
			imagenNueva = req.getParameter("imagen_nueva_" + i++);
		}
		i = 0;
		String imagenEliminada = req.getParameter("imagen_eliminada_" + i++);
		while (imagenEliminada!=null)
		{
			File file = (File) FileUploadManager.getInstance().getFiles().get(imagenEliminada);
			file.delete();
			FileUploadManager.getInstance().getFiles().remove(imagenEliminada);
			imagenEliminada = req.getParameter("imagen_eliminada_" + i++);
		}
		
		itImagenes = this.getVistaBO().getImagenesByTabImagenOrderByPosicion(idTab).iterator();
		String textoGallery = "";
		String path = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath() + "/";
		i=1;
		while (itImagenes.hasNext())
		{
			ImagenTab img = (ImagenTab) itImagenes.next();
			textoGallery +="<li id='id_" + img.getId() + "'>" +
						"<a class='thumb' name='leaf' href='" + path + "file.act?beanId=" + img.getId() + "&tipoImagen=tab' title='" + img.getFileName() + "'> <img src='" + path + "file.act?beanId=" + img.getId() + "&tipoImagen=tab'/> </a>" +
					"</li>";
		}
		if (textoGallery.equals(""))
			textoGallery =	"<li class='imagen_por_defecto'>" +
						"<a class='thumb' name='leaf' href='" + path + "templates/images/user.png' title=''> <img src='" + path + "templates/images/user.png'/> </a>" +
					"</li>";
		
		JSONArray array = new JSONArray ();
		
		array.put(textoGallery);
		
		XStream xstream = new XStream(new JsonHierarchicalStreamDriver());
		xstream.setMode(XStream.NO_REFERENCES);
		String result = xstream.toXML(array);
		result = result.substring(result.indexOf("myArrayList") + 14);// TODO basura
		res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate,post-check=0, pre-check=0");
		res.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
		res.getWriter().write(result.substring(0, result.length() - 2));// TODO basura
		
		
	}
	
	private void cancelarEditarFotos (HttpServletRequest req, HttpServletResponse res) throws IOException
	{
		String idTab = req.getParameter("idTab");
		int i = 0;
		String imagenNueva = req.getParameter("imagen_nueva_" + i++);
		while (imagenNueva!=null)
		{
			File file = (File) FileUploadManager.getInstance().getFiles().get(imagenNueva);
			file.delete();
			FileUploadManager.getInstance().getFiles().remove(imagenNueva);
			imagenNueva = req.getParameter("imagen_nueva_" + i++);
		}
		Iterator itImagenes = this.getVistaBO().getImagenesByTabImagenOrderByPosicion(idTab).iterator();
		String texto = "";
		String path = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + req.getContextPath() + "/";
		while (itImagenes.hasNext())
		{
			ImagenTab img = (ImagenTab) itImagenes.next();
			texto +="<li id='id_" + img.getId() + "'>" +
						"<a class='thumb' name='leaf' href='" + path + "file.act?beanId=" + img.getId() + "&tipoImagen=tab' title='" + img.getFileName() + "'> <img src='" + path + "file.act?beanId=" + img.getId() + "&tipoImagen=tab'/> </a>" +
					"</li>";
		}
		if (texto.equals(""))
			texto =	"<li class='imagen_por_defecto'>" +
						"<a class='thumb' name='leaf' href='" + path + "templates/images/user.png' title=''> <img src='" + path + "templates/images/user.png'/> </a>" +
					"</li>";
				
		res.getWriter().println(texto);
	}

	public IProveedorBO getProveedorBO() {
		return proveedorBO;
	}

	public void setProveedorBO(IProveedorBO proveedorBO) {
		this.proveedorBO = proveedorBO;
	}

	public IUbicacionBO getUbicacionBO() {
		return ubicacionBO;
	}

	public void setUbicacionBO(IUbicacionBO ubicacionBO) {
		this.ubicacionBO = ubicacionBO;
	}

	public IUsuarioBO getUsuarioBO() {
		return usuarioBO;
	}

	public void setUsuarioBO(IUsuarioBO usuarioBO) {
		this.usuarioBO = usuarioBO;
	}

	public IVistaBO getVistaBO() {
		return vistaBO;
	}

	public void setVistaBO(IVistaBO vistaBO) {
		this.vistaBO = vistaBO;
	}

	public IMensajesBO getMensajesBO() {
		return mensajesBO;
	}

	public void setMensajesBO(IMensajesBO mensajesBO) {
		this.mensajesBO = mensajesBO;
	}

	public IProductoBO getProductoBO() {
		return productoBO;
	}

	public void setProductoBO(IProductoBO productoBO) {
		this.productoBO = productoBO;
	}

	public String getSetCupones() {
		return setCupones;
	}

	public void setSetCupones(String setCupones) {
		this.setCupones = setCupones;
	}

	public String getSetOfertas() {
		return setOfertas;
	}

	public void setSetOfertas(String setOfertas) {
		this.setOfertas = setOfertas;
	}

	public IComentarioBO getComentarioBO()
	{
		return this.comentarioBO;
	}

	public void setComentarioBO(IComentarioBO comentarioBO)
	{
		this.comentarioBO = comentarioBO;
	}

	public ISucesosBO getSucesosBO() {
		return sucesosBO;
	}

	public void setSucesosBO(ISucesosBO sucesosBO) {
		this.sucesosBO = sucesosBO;
	}

}
